#ifndef _KRLMEMPOOL_H_
#define _KRLMEMPOOL_H_

#include <krlmempool_t.h>

/* initialize structure */

void kmempool_init (void);
void kmempool_t_init (kmempool_t * initp);
void mempoolhead_t_init (mempoolhead_t * initp);

/* base for new and free */

mempoolhead_t * kmempool_page_init (kmempool_t * kmempool, mempoolhead_t * mempoolhead, size_t size, addr_t addrstart, addr_t addrend);
mempoolhead_t * kmempool_create_page_mempoolhead (kmempool_t * kmempool, size_t size);
bool_t kmempool_destroy_page_mempoolhead (kmempool_t * kmempool, mempoolhead_t * mempoolhead);

mempoolhead_t * kmempool_byte_init (kmempool_t * kmempool, mempoolhead_t * mempoolhead, size_t size, addr_t addrstart, addr_t addrend);
mempoolhead_t * kmempool_create_byte_mempoolhead (kmempool_t * kmempool, size_t size);
bool_t kmempool_destroy_byte_mempoolhead (kmempool_t * kmempool, mempoolhead_t * mempoolhead);

/* routine for new */

addr_t kmempool_new (size_t newsz);
addr_t kmempool_onsize_new (size_t newsz);

mempoolhead_t * kmempool_pagenew_check_mempoolhead (mempoolhead_t * mempoolhead, size_t newsz);
mempoolhead_t * kmempool_pagenew_return_mempoolhead (kmempool_t * kmempool, size_t newsz);
addr_t kmempool_pagenew_on_mempoolhead (mempoolhead_t * mempoolhead);
addr_t kmempool_pages_new (size_t newsz);
addr_t kmempool_pages_new_callhalmm (size_t newsz);
addr_t kmempool_pages_core_new (size_t newsz);

mempoolhead_t * kmempool_bytenew_check_mempoolhead (mempoolhead_t * mempoolhead, size_t newsz);
mempoolhead_t * kmempool_bytenew_return_mempoolhead (kmempool_t * kmempool, size_t newsz);
addr_t kmempool_bytenew_on_mempoolhead (mempoolhead_t * mempoolhead);
addr_t kmempool_bytes_new (size_t newsz);
addr_t kmempool_bytes_core_new (size_t newsz);

/* routine for free */

bool_t kmempool_delete (addr_t deladdr, size_t delsz);
bool_t kmempool_onsize_delete (addr_t deladdr, size_t delsz);

mempoolhead_t * kmempool_pagedel_check_mempoolhead (mempoolhead_t * mempoolhead, addr_t deladdr, size_t delsz);
mempoolhead_t * kmempool_pagedel_return_mempoolhead (kmempool_t * kmempool, addr_t deladdr, size_t delsz);
bool_t kmempool_pagedel_on_mempoolhead (mempoolhead_t * mempoolhead, addr_t deladdr);
bool_t kmempool_pages_delete (addr_t deladdr, size_t delsz);
bool_t kmempool_pages_delete_callhalmm (addr_t deladdr, size_t delsz);
bool_t kmmpool_pages_core_delete (addr_t deladdr, size_t delsz);

mempoolhead_t * kmempool_bytedel_check_mempoolhead (mempoolhead_t * mempoolhead, addr_t deladdr, size_t delsz);
mempoolhead_t * kmempool_bytedel_return_mempoolhead (kmempool_t * kmempool, addr_t deladdr, size_t delsz);
bool_t kmempool_bytedel_on_mempoolhead (mempoolhead_t * mempoolhead, addr_t deladdr);
bool_t kmempool_bytes_delete (addr_t deladdr, size_t delsz);
bool_t kmmpool_bytes_core_delete (addr_t deladdr, size_t delsz);

#endif
